//
// Created by 12992 on 24-10-26.
//

#include "base64.h"
#include <utility>
#include <openssl/buffer.h>

namespace crypto
{
    using namespace std;

    std::string base64::encrypt(const std::string& data)
    {
        BUF_MEM* bptr;
        BIO* b64 = BIO_new(BIO_f_base64());
        // 创建一个内存缓冲区BIO
        BIO* bmem = BIO_new(BIO_s_mem());
        // 将内存缓冲区BIO推送到Base64 BIO过滤器上
        b64 = BIO_push(b64, bmem);
        // 设置Base64 BIO的标志，使其在输出时不添加换行符
        BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);
        // 将原始数据写入Base64 BIO
        BIO_write(b64, data.c_str(), data.size());
        // 刷新BIO，确保所有数据都被处理
        BIO_flush(b64);
        // 获取内存缓冲区中的数据
        BIO_get_mem_ptr(b64, &bptr);
        string output(bptr->data, bptr->length);
        BIO_free_all(b64);
        return output;
    }

    std::string base64::decrypt(const std::string& data)
    {
        // 创建一个新的Base64 BIO过滤器
        BIO* b64 = BIO_new(BIO_f_base64());
        // 设置Base64 BIO的标志，使其在处理时忽略换行符
        BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);
        // 创建一个新的内存缓冲区BIO，并将其初始化为输入字符串
        BIO* bmem = BIO_new_mem_buf(data.c_str(), data.size());
        // 将内存缓冲区BIO推送到Base64 BIO过滤器上
        bmem = BIO_push(b64, bmem);
        // 从BIO中读取解码后的数据
        string output(data.size(), '\0');
        int output_len = BIO_read(bmem, &output[0], output.size());
        // 释放所有BIO资源
        BIO_free_all(bmem);
        return output.substr(0, output_len);
    }
} // crypto
